import * as vscode from 'vscode'

/**
 * 编号类型枚举
 * 定义多行编号支持的类型
 */
enum IncrementType {
	Number,     // 数字
	Lowercase,  // 小写字母
	Uppercase   // 大写字母
}

/**
 * 字母表长度常量
 */
const ALPHABET_LENGTH = 26

/**
 * ASCII小写字母起始值常量
 */
const ASCII_LOWERCASE_START = 97

/**
 * ASCII大写字母起始值常量
 */
const ASCII_UPPERCASE_START = 65

/**
 * 获取编号类型函数
 * 根据配置获取编号类型
 * @returns 编号类型
 */
const getType = (): IncrementType => {
	const config = vscode.workspace.getConfiguration()
	const type = config.get<string>('Pad', '') // 添加默认值
	
	switch (type) {
		case 'a': return IncrementType.Lowercase
		case 'A': return IncrementType.Uppercase
		default: return IncrementType.Number
	}
}

/**
 * 获取增量字符函数
 * 根据索引和类型生成相应的字符
 * @param index 索引
 * @param type 编号类型
 * @returns 生成的字符
 */
const getIncrementChar = (index: number, type: IncrementType): string => {
	switch (type) {
		case IncrementType.Number:
			return `${index + 1}`
		case IncrementType.Lowercase:
			return String.fromCharCode(ASCII_LOWERCASE_START + (index % ALPHABET_LENGTH))
		case IncrementType.Uppercase:
			return String.fromCharCode(ASCII_UPPERCASE_START + (index % ALPHABET_LENGTH))
	}
}

/**
 * 多行补全数字编号函数
 * 为多行选择添加编号
 */
export const incrementSelection = () => {
	// 获取活动编辑器
	const editor = vscode.window.activeTextEditor
	if (!editor) {
		vscode.window.showWarningMessage('没有活动的编辑器')
		return
	}

	// 获取并排序选择区域
	const selections = [...editor.selections].sort((a, b) => a.start.line - b.start.line)
	if (selections.length === 0) return

	// 获取第一个选择区域的文本
	const firstSelection = selections[0]
	const firstText = editor.document.getText(new vscode.Range(
		firstSelection.start.line,
		Math.max(0, firstSelection.start.character - 1),
		firstSelection.end.line,
		firstSelection.end.character
	))

	// 根据文本内容或配置确定类型
	let type = getType()
	if (/[a-z]/.test(firstText)) type = IncrementType.Lowercase
	if (/[A-Z]/.test(firstText)) type = IncrementType.Uppercase

	// 批量替换
	editor.edit(editBuilder => {
		selections.forEach((selection, index) => {
			editBuilder.replace(selection, getIncrementChar(index, type))
		})
	})
}